import type { FormInstance } from 'antd';

export const FORM_STORAGE_PREFIX = 'sdcal_form_';

/**
 * 递归转换对象中的字符串数字为实际数字类型
 * 确保从localStorage读取的数据类型正确
 * @param obj 需要转换的对象
 * @returns 转换后的对象，其中字符串数字已转为数字类型
 */
function convertStringNumbers<T>(obj: T): T {
  if (obj === null || obj === undefined) {
    return obj;
  }
  
  if (Array.isArray(obj)) {
    return obj.map(item => convertStringNumbers(item)) as unknown as T;
  }
  
  if (typeof obj === 'object') {
    const result: Record<string, any> = {};
    for (const key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        result[key] = convertStringNumbers((obj as Record<string, any>)[key]);
      }
    }
    return result as T;
  }
  
  // 检查字符串是否可以转换为数字
  if (typeof obj === 'string') {
    const num = Number(obj);
    // 确保不是NaN且转换后的值与原始字符串表示相同
    if (!isNaN(num) && String(num) === obj) {
      return num as unknown as T;
    }
  }
  
  return obj;
}


/**
 * 获取表单初始值
 * 从localStorage中读取并转换表单数据类型
 * @param key 表单存储键名
 * @returns 表单初始值对象或null（如果不存在）
 */
export function getFormInitialValues<T extends Record<string, any>>(key: string): T | null {
  try {
    const k = FORM_STORAGE_PREFIX + key;
    const raw = localStorage.getItem(k);
    if (!raw) return null;
    
    const parsed = JSON.parse(raw);
    // 转换所有字符串数字为实际数字类型
    return convertStringNumbers<T>(parsed);
  } catch (e) {
    console.error('获取表单初始值失败:', e);
    return null;
  }
}

// 用于区分默认值和用户值的后缀
export const DEFAULT_VALUE_SUFFIX = '_default';

/**
 * 保存表单初始值到localStorage
 * @param key 表单存储键名
 * @param values 表单值对象
 * @returns 是否保存成功
 */
export function saveFormInitialValues<T extends Record<string, any>>(key: string, values: T): boolean {
  try {
    const k = FORM_STORAGE_PREFIX + key;
    localStorage.setItem(k, JSON.stringify(values || {}));
    return true;
  } catch (e) {
    console.warn('保存表单初始值失败:', e);
    return false;
  }
}

/**
 * 保存表单的默认初始值
 * @param key 表单存储键名
 * @param values 默认值对象
 * @returns 是否保存成功
 */
export function saveFormDefaultValues<T extends Record<string, any>>(key: string, values: T): boolean {
  try {
    const k = FORM_STORAGE_PREFIX + key + DEFAULT_VALUE_SUFFIX;
    localStorage.setItem(k, JSON.stringify(values || {}));
    return true;
  } catch (e) {
    console.warn('保存表单默认值失败:', e);
    return false;
  }
}

/**
 * 获取表单的默认初始值
 * @param key 表单存储键名
 * @returns 默认值对象或null（如果不存在）
 */
export function getFormDefaultValues<T extends Record<string, any>>(key: string): T | null {
  try {
    const k = FORM_STORAGE_PREFIX + key + DEFAULT_VALUE_SUFFIX;
    const raw = localStorage.getItem(k);
    if (!raw) return null;
    
    const parsed = JSON.parse(raw);
    // 转换所有字符串数字为实际数字类型
    return convertStringNumbers<T>(parsed);
  } catch (e) {
    console.error('获取表单默认值失败:', e);
    return null;
  }
}

/**
 * 重置表单到上次保存的用户参数
 * @param form 表单实例
 * @param key 表单存储键名
 * @returns 是否重置成功
 */
export function resetFormToInitial<T extends Record<string, any>>(form: FormInstance<T>, key: string): boolean {
  try {
    const data = getFormInitialValues<T>(key);
    if (data) {
      form.setFieldsValue(data);
      return true;
    }
    return false;
  } catch (e) {
    console.error('重置表单失败:', e);
    return false;
  }
}

/**
 * 清除表单存储
 * @param key 表单存储键名
 * @returns 是否清除成功
 */
export function clearFormStorage(key: string): boolean {
  try {
    const userKey = FORM_STORAGE_PREFIX + key;
    const defaultValueKey = FORM_STORAGE_PREFIX + key + DEFAULT_VALUE_SUFFIX;
    
    localStorage.removeItem(userKey);
    localStorage.removeItem(defaultValueKey);
    return true;
  } catch (e) {
    console.error('清除表单存储失败:', e);
    return false;
  }
}

/**
 * 检查表单是否有保存的值
 * @param key 表单存储键名
 * @returns 是否存在保存的值
 */
export function hasSavedFormValues(key: string): boolean {
  try {
    const k = FORM_STORAGE_PREFIX + key;
    return localStorage.getItem(k) !== null;
  } catch (e) {
    console.error('检查表单保存值失败:', e);
    return false;
  }
}
/**
 * 重置表单到组件初始化时的默认参数
 * @param form 表单实例
 * @param key 表单存储键名
 * @returns 是否重置成功
 */
export function resetFormToDefault<T extends Record<string, any>>(form: FormInstance<T>, key: string): boolean {
  try {
    const data = getFormDefaultValues<T>(key);
    if (data) {
      form.setFieldsValue(data);
      return true;
    }
    return false;
  } catch (e) {
    console.error('重置表单到默认值失败:', e);
    return false;
  }
}
